using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

// 剧情触发类
public class Plot : MonoBehaviour
{
    public float CoolingTime = 60; // 冷却时间，控制剧情重新触发的间隔时间
    private float waitCount = 0;   // 计时器，用于计算冷却时间
    private bool PlotEnable = true; // 是否允许剧情触发

    private void Update() {
        // 当剧情不可用并且当前没有正在进行的剧情时，开始计时
        if (PlotEnable == false && CharacterParam.param.isPlot == false) {
            waitCount += Time.deltaTime; // 增加计时器的值，Time.deltaTime为每帧所消耗的时间
            // 如果计时器超过冷却时间，则重新允许剧情触发
            if (waitCount >= CoolingTime) {
                PlotEnable = true;
                waitCount = 0; // 重置计时器
            }
        }
    }

    // 触发剧情，当玩家或其他对象停留在触发器区域内时调用
    private void OnTriggerStay(Collider other) {
        // 检查剧情类型为每日剧情，并且剧情可以触发，且当前没有正在进行的剧情
        if (type == plotType.Daily && PlotEnable == true && CharacterParam.param.isPlot != true) {
            RemindUI.remindUI.setInfoPlotText("F进入剧情"); // 设置提示信息为"F进入剧情"
            RemindUI.remindUI.showInfoPlot(); // 显示剧情提示UI
        }
        else {
            RemindUI.remindUI.setInfoPlotText(""); // 清除提示信息
            RemindUI.remindUI.hideInfoPlot(); // 隐藏剧情提示UI
        }
        // 当剧情文件存在、剧情可以触发并且没有进行中的剧情时
        if (plotFile != null && PlotEnable && CharacterParam.param.isPlot != true) {
            // 如果剧情类型为强制剧情，或者玩家按下了进入剧情的键
            if (type == plotType.Force || Input.GetKey(InputControl.input.EnterPlotKey)) {
                InputControl.UnLockMouse(); // 解锁鼠标
                PlotManager.plotManager.Play(plot); // 通过PlotManager开始播放剧情
                CharacterParam.param.isPlot = true; // 标记当前有正在进行的剧情
                PlotEnable = false; // 设置剧情不可用，进入冷却状态
            }
        }
    }

    // 当对象离开触发器区域时调用
    private void OnTriggerExit(Collider other) {
        RemindUI.remindUI.setInfoPlotText(""); // 清除提示信息
        RemindUI.remindUI.hideInfoPlot(); // 隐藏剧情提示UI
        // 如果有正在进行的剧情，禁用剧情触发
        if (CharacterParam.param.isPlot == true) {
            PlotEnable = false;
        }
        CharacterParam.param.isPlot = false; // 重置剧情状态为未进行
        DialogUI.dialog.hide(); // 隐藏对话UI
        // 如果剧情类型不是每日剧情，并且没有正在进行的剧情，将触发器对象隐藏
        if (type != plotType.Daily && CharacterParam.param.isPlot == false) {
            transform.GameObject().SetActive(false);
        }
    }

    public TextAsset[] plotFile; // 剧情文件，存储多个剧情文本
    public plotType type; // 剧情类型（例如每日剧情或强制剧情）
    private List<DialogGroup> plot; // 存储处理过的剧情对话列表

    private void Start() {
        // 初始化剧情列表，大小与剧情文件数组一致，每个元素初始化为null
        plot = new List<DialogGroup>();
        for (int i = 0; i < plotFile.Length; i++) {
            plot.Add(null);
        }
        // 加载剧情并处理
        getPlot();
    }

    // 加载剧情文件并进行处理
    private void getPlot() {
        for (int i = 0; i < plotFile.Length; i++) {
            // 加载剧情数据，并设置每组对话的位置
            SetDialogGroupPosition(JsonTools.LoadPlot(plotFile[i]));
        }
    }

    // 设置一组对话的位置
    private void SetDialogGroupPosition(DialogGroup item) {
        string[] tagPos = item.position.Split('-'); // 解析对话组的排序标识
        int pos = 0; // 当前对话组的位置
        for (int i = 0; i < tagPos.Length; i++) {
            pos = pos * 3 + int.Parse(tagPos[i]); // 计算位置，使用三进制编码的位置
        }
        // 如果计算的位置超出了当前列表大小，扩展列表大小
        while (pos >= plot.Count) {
            plot.Add(null);     // 扩展列表大小
        }
        plot[pos] = item; // 将对话组添加到计算的位置
    }
}
